package jobscheduling.algorithms.pso;

//package flowshop.Solution;

/**
 * Liczy laczny czas wykonania wszystkich zadan w danym rozwiazaniu
 * 
 * @author Konrad Tendera
 * 
 */
public class SolutionEvaluator {

	/**
	 * oblicza czas po jakim zakoncza prace wszytskie maszyny w ustawianiu jak w
	 * solution
	 */
	public static int getEval(InputData data, int[] solution) {
		int makeSpan = 0;
		int works = data.getJobs();
		int machines = data.getMachines();

		/**
		 * calculate(w, m,data, solution ) - oblicza czas w-tej pracy na m-tej
		 * maszynie z uzytymi parametrami oblicza po jakim czasie ostatnie
		 * podzadanie, ostatniej pracy wykonywana sie na ostatniej maszynie
		 */
		makeSpan = calculate(works - 1, machines - 1, data, solution);
		return makeSpan;
	}

	/** w - numer pracy, m - numer maszyna */
	private static int calculate(int w, int m, InputData data, int[] solution) {
		if (w == 0 && m == 0) {
			// data[machines][jobs];
			return data.data_[w][solution[m]];
		}

		if (m == 0) {
			return calculate(w - 1, m, data, solution)
					+ data.data_[0][solution[w]];
		}

		if (w == 0) {
			return calculate(w, m - 1, data, solution)
					+ data.data_[m][solution[w]];
		}

		return max(calculate(w - 1, m, data, solution),
				calculate(w, m - 1, data, solution))
				+ data.data_[m][solution[w]];
	}

	private static int max(int x, int y) {
		if (x > y) {
			return x;
		} else {
			return y;
		}
	}
}
